package com.yylending.las.common.utils.preferenceutils;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v4.content.SharedPreferencesCompat;

import com.yyfax.infrastructure.store.sharedpreferences.SecuredPreference;
import com.yylending.las.common.widgets.lockpattern.ACache;

import java.util.HashMap;
import java.util.Map;


/**
 * SharePreference缓存管理
 * 保存缓存使用通用方法 {@link #savePreference(String, Object)}
 * 获取缓存的方法一对一区分开，防止误操作。
 * 缓存key必须在{@link PreferenceConstants}统一配置。
 *
 * @author ying_he
 * @date 2017/3/14 15:34
 */
public class PreferenceManager {
	private static final String OLD_SP_FILE_NAME = "SHARE_DATA";

	private static final String VERSION = "20170328";
	private static final String SP_FILE_NAME = "LAS_PREFS" + "_" + VERSION;
	private static final String SP_ENCRYPT_PWD = "";

	// 旧版数据
	private SharedPreferences mOldPreference;
	private SharedPreferences mPreference;
	// 缓存已使用过的Value，减少重复查找操作。
	private Map<String, Object> mCacheGeneratedValue = new HashMap<>();

	public PreferenceManager(Context context) {
		// 兼容旧版升级新版数据
		mOldPreference = context.getSharedPreferences(OLD_SP_FILE_NAME, Context.MODE_PRIVATE);
		try {
			mPreference = new SecuredPreference(context.getApplicationContext(), SP_ENCRYPT_PWD, SP_FILE_NAME);
		} catch (Exception e) {
			mPreference = SecuredPreference.useAndroidSharedPreference(context.getApplicationContext(), SP_FILE_NAME);
		}
	}

	/**
	 * 存缓存,统一存为String
	 * 仅允许存储String，基本数据类型，JSONObject，JSONArray。序列化对象、文件缓存、或者复杂JSON字串存储，请使用{@link ACache.ACacheManager}
	 *
	 * @param key   所有缓存的key需统一在{@link PreferenceConstants#}中配置，在使用中key不允许出现硬编码。
	 * @param value
	 */
	public PreferenceManager savePreference(String key, Object value) {
		if (value == null) {
			return this;
		}
		if (!mCacheGeneratedValue.containsKey(key) || !mCacheGeneratedValue.get(key).equals(value)) {
			SharedPreferences.Editor editor = mPreference.edit();
			editor.putString(key, String.valueOf(value));
			SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
			mCacheGeneratedValue.put(key, value);
		}
		return this;
	}

	/**
	 * @param key 所有缓存的key需统一在{@link PreferenceConstants#}中配置，在使用中key不允许出现硬编码。
	 */
	public PreferenceManager remove(String key) {
		SharedPreferences.Editor editor = mPreference.edit();
		editor.remove(key);
		SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
		mCacheGeneratedValue.remove(key);
		return this;
	}

	public void clear() {
		SharedPreferences.Editor editor = mPreference.edit();
		editor.clear();
		SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
		mCacheGeneratedValue.clear();
	}

	/**
	 * @param key 所有缓存的key需统一在{@link PreferenceConstants#}中配置，在使用中key不允许出现硬编码。
	 */
	private String optString(String key, String defaultValue) {
		String value;
		if (mCacheGeneratedValue.containsKey(key)) {
			value = String.valueOf(mCacheGeneratedValue.get(key));
		} else {
			value = mPreference.getString(key, defaultValue);
			mCacheGeneratedValue.put(key, value);
		}
		return value;
	}

	/**
	 * @param key 所有缓存的key需统一在{@link PreferenceConstants#}中配置，在使用中key不允许出现硬编码。
	 */
	private float optFloat(String key, float defaultValue) {
		float value;
		if (mCacheGeneratedValue.containsKey(key)) {
			value = Float.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
		} else {
			value = mPreference.getFloat(key, defaultValue);
			mCacheGeneratedValue.put(key, value);
		}
		return value;
	}

	/**
	 * @param key 所有缓存的key需统一在{@link PreferenceConstants#}中配置，在使用中key不允许出现硬编码。
	 */
	private long optLong(String key, long defaultValue) {
		long value;
		if (mCacheGeneratedValue.containsKey(key)) {
			value = Long.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
		} else {
			value = mPreference.getLong(key, defaultValue);
			mCacheGeneratedValue.put(key, value);
		}
		return value;
	}

	/**
	 * @param key 所有缓存的key需统一在{@link PreferenceConstants#}中配置，在使用中key不允许出现硬编码。
	 */
	private int optInt(String key, int defaultValue) {
		int value;
		if (mCacheGeneratedValue.containsKey(key)) {
			value = Integer.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
		} else {
			value = mPreference.getInt(key, defaultValue);
			mCacheGeneratedValue.put(key, value);
		}
		return value;
	}

	/**
	 * @param key 所有缓存的key需统一在{@link PreferenceConstants#}中配置，在使用中key不允许出现硬编码。
	 */
	private boolean optBoolean(String key, boolean defaultValue) {
		boolean value;
		if (mCacheGeneratedValue.containsKey(key)) {
			value = Boolean.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
		} else {
			value = mPreference.getBoolean(key, defaultValue);
			mCacheGeneratedValue.put(key, value);
		}
		return value;
	}

	public String getRSA() {//获取保存的RSA密钥
		return optString(PreferenceConstants.KEY_RSA, "");
	}

	public String getLoginToken() {
		return optString(PreferenceConstants.SP_KEY_LOGIN_TOKEN, "");
	}

	public String getLoginName() {//获取保存的登录手机号
		return optString(PreferenceConstants.KEY_LOGIN_NAME, "");
	}

	public String getLocationInfo() {//获取保存的定位信息
		return optString(PreferenceConstants.KEY_LOCATION_INFO, "");
	}

	public String getBaseInfo() {//获取保存的基本信息(获取额度第一页)
		return optString(PreferenceConstants.KEY_BASE_INFO, "");
	}

	public String getOptions() {//获取保存的选项卡信息
		return optString(PreferenceConstants.KEY_OPTIONS, "");
	}

	public boolean getAgreementRead(boolean defaultValue) {//获取是否同意用户协议
		return optBoolean(PreferenceConstants.KEY_USER_AGREEMENT, defaultValue);
	}

	public boolean getGestureStatus(boolean defaultValue) {//获取手势密码开关状态
		return optBoolean(PreferenceConstants.KEY_CONFIGURATION_GESTURES, defaultValue);
	}

	public int getGestureCount(int defaultValue) {//获取手势密码错误次数
		return optInt(PreferenceConstants.KEY_CONFIGURATION_GESTURES_COUNT, defaultValue);
	}

	public boolean isFirstLaunch(boolean defaultValue) {//是否第一次打开应用
		return optBoolean(PreferenceConstants.KEY_FIRST_TIME_TO_LAUNCH, defaultValue);
	}

	public Long getLastCancelUpdateTime(Long defaultValue) {
		return optLong(PreferenceConstants.LAST_CANCEL_UPDATE_TIME, defaultValue);
	}

	public boolean isEnablePatternLock() {
		return optBoolean(PreferenceConstants.SP_KEY_GESTURES_TOGGLE, false);
	}

	public String getPatternLock() {
		return optString(PreferenceConstants.SP_KEY_GESTURES_STRING, "");
	}

	// 手势密码解锁失败次数
	public int getUnlockFailedTimes() {
		return optInt(PreferenceConstants.SP_KEY_GESTURES_COUNT, 0);
	}

	public String getLoginUserId() {//获取保存的登录UserId
		return optString(PreferenceConstants.SP_KEY_LOGIN_USERID, "");
	}

	public String getUserName() {//获取登录时返回的用户名
		return optString(PreferenceConstants.SP_KEY_USER_NAME, "");
	}

	public String getAES() {//获取保存的AES密钥
		return optString(PreferenceConstants.KEY_AES, "");
	}

	public boolean isEnableFingerprint() {
		return optBoolean(PreferenceConstants.SP_KEY_FINGERPRINT_TOGGLE, false);
	}

	/**
	 * 获取app版本号
	 */
	public int getAppVersion(int defaultValue) {
		return optInt(PreferenceConstants.SP_KEY_APP_VERSION, defaultValue);
	}

	public long getTinkerTimestamp() {
		return optLong(PreferenceConstants.TINKER_TIME_STAMP, 0);
	}

	public String getTinkerUrl() {
		return optString(PreferenceConstants.TINKER_URL, "");
	}

	public boolean getTinkerDownLoadCompleted() {
		return optBoolean(PreferenceConstants.TINKER_DOWNLOAD_COMPLETED, false);
	}

	public boolean getTinkerNeedRestart() {
		return optBoolean(PreferenceConstants.TINKER_NEED_RESTART, false);
	}

	public String getTinkerResult() {
		return optString(PreferenceConstants.TINKER_RESULT, "");
	}
}
